package campus.aiit.ssl.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

/**
 * @author ihaokun
 * @date 2019/12/3 9:10
 */
@Configuration
public class FiltersConfiguration {
  @Value("${frontEnd.index}") private String indexUrl;

  @Bean
  public FilterRegistrationBean<CorsFilter> corsFilter() {
    FilterRegistrationBean<CorsFilter> registrationBean = new FilterRegistrationBean<>();
    // 注入过滤器
    registrationBean.setFilter(new CorsFilter());
    // 拦截规则（所有请求）
    registrationBean.addUrlPatterns("*");
    // 过滤器名称
    registrationBean.setName("corsFilter");
    registrationBean.setOrder(0);
    return registrationBean;
  }
  @Bean
  public FilterRegistrationBean<LocalizedFilterChainProxy> uaacClientFilter() throws UnsupportedEncodingException {
    FilterRegistrationBean<LocalizedFilterChainProxy> registrationBean = new FilterRegistrationBean<>();
    // 注入过滤器
    registrationBean.setFilter(new LocalizedFilterChainProxy());
    // 拦截规则（拦截所有请求）
    registrationBean.addUrlPatterns("*");
    /*
     * XXX 注意：查看uaac的源码（VirtualFilterChain 和 AuthenticationFilter）发现，
     * XXX 若是Ajax请求，该过滤器 还需 带上指定参数（用于在 过滤链 的 AuthenticationFilter中判断是否为Ajax请求；且是Ajax请求并认证未登陆则返回登陆url，）
     */
    registrationBean.addInitParameter("casAuthAjaxContext", "casServerLoginUrl?service=" + URLEncoder.encode(indexUrl, "utf-8"));
    // 过滤器名称
    registrationBean.setName("uaacClientFilter");
    registrationBean.setOrder(1);
    return registrationBean;
  }
//  @Bean
//  public FilterRegistrationBean<CookieFilter> cookieFilter() {
//    FilterRegistrationBean<CookieFilter> registrationBean = new FilterRegistrationBean<>();
//    // 注入过滤器
//    registrationBean.setFilter(new CookieFilter());
//    // 拦截规则（拦截所有请求）
//    registrationBean.addUrlPatterns("*");
//    // 过滤器名称
//    registrationBean.setName("cookieFilter");
//    registrationBean.setOrder(2);
//    return registrationBean;
//  }
}